/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package AST;

import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Eddy
 */
public class Nota extends Instruccion implements  Cloneable{
    Simbolo Nota=null;
    Simbolo Figu=null;
    Simbolo Mod=null;
    
    String SNota; //Do Re Mi Fa Sol....
    public String MayorMenor="";
    public String Figura="";   
    public String Modificador="";
    public int   Repetir=0;
    
    public String Tipo;  //Redonda Blaca Negra Corecha Semi-Corchea
    
    boolean Sielcio=false;
    
    boolean Doble=false;
    
    boolean Bemol=false;
    boolean Sostenido=false;
    
    public Double Tiempo=0.0;
    
    public Nota subNota;
    
    public boolean Sol=false;
    public boolean Do=false;
    public boolean Re=false;
    public boolean Fa=false;
    
    public Nota (int l, int c,String Nota, String Mm,String BS)
    {
        this.NoLinea=l;
        this.Columna=c;
        if(!BS.equals(""))
        {
        if(BS.equals("B")){this.Bemol=true;}
        if(BS.equals("BB")){this.Doble=true; this.Bemol=true;}
        if(BS.equals("#")){this.Sostenido=true;}
        if(BS.equals("##")){this.Doble=true; this.Sostenido=true;}
        this.Modificador=BS;
        }
        this.SNota=Nota;
        if(!Mm.equals("")){this.MayorMenor=Mm;}
        this.Figura="";
        
    }
    
    public Nota(int l,int c,String nota,String figura,String BS,String Mm,Nota SN)
    {
      this.NoLinea=l;
        this.Columna=c;
        if(!BS.equals(""))
        {
        if(BS.equals("B")){this.Bemol=true;}
        if(BS.equals("BB")){this.Doble=true; this.Bemol=true;}
        if(BS.equals("#")){this.Sostenido=true;}
        if(BS.equals("##")){this.Doble=true; this.Sostenido=true;}
        this.Modificador=BS;
        }
        this.Figura=figura;
        this.SNota=nota;
        this.subNota=SN;
        if(!Mm.equals("")){this.MayorMenor=Mm;}   
    }
    public Double  TiempoNotas()
    {
        Double tiempo=0.0;
        //Buscar en la tabla de simbolos es alias de la figura
        
        if(Tipo.equals("1")){tiempo=1.0;}      //Redonda
        if(Tipo.equals("2")){tiempo=1.0/2.0;}    //Blanca
        if(Tipo.equals("4")){tiempo=1.0/4.0;}    //Negra
        if(Tipo.equals("8")){tiempo=1.0/8.0;}    //Corechea
        if(Tipo.equals("16")){tiempo=1.0/16.0;}   //Semi-Corechea
        
        return tiempo;
    }
    
    public void CalcularTiempoTotal()
    {
        int R;
        if(Repetir==0){R=1;}
        else{R=Repetir;}
         Tiempo=Tiempo+R*TiempoNotas();
    }
    
    public boolean CargarTS()
    {
        
        boolean res=true;
        if(Figura.equals(""))
        {
            //Figura="NEGRA";
            this.Tipo="2";
        }
        if(subNota!=null)
        {
           subNota.Do=Do;
           subNota.Sol=Sol;
           subNota.Re=Re;
           subNota.Fa=Fa;
           
           subNota.tabla=tabla;
           if(subNota.SNota.equals(""))
           {
               subNota.SNota=SNota;
           }
           if(subNota.Figura.equals(""))
           {
               subNota.Figura=Figura;
           }
           subNota.CargarTS();
           Tiempo=subNota.Tiempo;
        }
        Simbolo N=null,F=null,M=null;
        //Buscar Nota Buscar Figura y errores
        if((N=tabla.BuscarNota(this.SNota))!=null){this.Nota=N;}
        else{res=false;Errores.InsertarError(NoLinea, Columna, "No se encuetra la Nota "+this.SNota);
        }//Error No se encuetra la Nota
        //System.out.println("++"+this.NoLinea+"++++");
        if(this.Figura!=""&&res)
        {
            if((F=tabla.BuscarFigura(this.Figura))!=null){this.Tipo=Integer.toString(F.Tipo);this.Figu=F;}
            else{res=false;Errores.InsertarError(NoLinea, Columna, "No s enceutra la figura  "+this.Figura);
            }//Error No se Encuetra la Figra
        }
        else{this.Tipo="4";}
        
        if(this.Modificador!=""&&res)
        {
            if((M=tabla.BuscarAletracion(this.Modificador)) !=null)
            {
                if(M.Nombre.equals("b")){ this.Doble=false; this.Bemol=true; this.Sostenido=false;}
                if(M.Nombre.equals("bb")){this.Doble=true;  this.Bemol=true; this.Sostenido=false;}
                if(M.Nombre.equals("#")){ this.Doble=false; this.Bemol=false;this.Sostenido=true;}
                if(M.Nombre.equals("##")){this.Doble=true;  this.Bemol=false;this.Sostenido=true;}
                this.Mod=M;
            }
           // else{res=false;Errores.InsertarError(NoLinea, Columna, "No existe el modificador "+this.Modificador)}
        }       
        
        CalcularTiempoTotal();
        return res;
    }
    
    public boolean Traduccion()
   {
       boolean res=true;
       String TT="";
       String SubT="";
       String SubTABC="";
       String TTABC="";
       String temp01="";
       String temp02="";
       
       String temp03="";
       String temp04="";
       
       if(Do){temp02="4";}
       if(Re){temp02="2";}
       if(Fa){temp02="3";}
       if(Sol){temp02="5";}
       
       
       if(this.subNota!=null)
       {
           this.subNota.Traduccion();
           SubT=this.subNota.Traduccion;
           SubTABC=this.subNota.TraduccionABC4J;
       }
       
       if(this.Figu==null){if(this.Figura.equals("")){TT="q";TTABC="2";}}
       else{
       if(this.Figu.Tipo==1){TT=this.Figu.Tipol; TTABC="8";}
       if(this.Figu.Tipo==2){TT=this.Figu.Tipol; TTABC="4";}
       if(this.Figu.Tipo==4){TT=this.Figu.Tipol; TTABC="2";}
       if(this.Figu.Tipo==8){TT=this.Figu.Tipol; TTABC="1";}
       if(this.Figu.Tipo==16){TT=this.Figu.Tipol; TTABC="1/2";}
       }
       
       if(this.Bemol){
           if(this.Doble){temp01="bb";}else{temp01="b";temp03="";}}
       if(this.Sostenido){
           if(this.Doble){temp01="##";}else{temp01="#";temp03="";}}
       
       
       if(this.MayorMenor.equals(">"))
       {
           if(Do){temp02="5";}
           if(Re){temp02="3";}
           
           if(Fa){temp02="4";}
           if(Sol){temp02="6";}
           //temp02="maj";    
           temp04="8";
       }
       
       if(this.Nota!=null)
       {
           if(this.Nota.Mayor)
           {
               if(Do){temp02="5";}
               if(Re){temp02="3";}
               if(Fa){temp02="4";}
               if(Sol){temp02="6";}
           //temp02="maj";    
                temp04="8";
               
           }
       }
       
       if(this.MayorMenor.equals("<"))
       {
           if(Do){temp02="3";}
           if(Re){temp02="1";}           
           if(Fa){temp02="2";}
           if(Sol){temp02="4";}
           //temp02="min";
           temp04=",";
       }
       
       if(this.Nota!=null)
       {
           if(this.Nota.Menor)
           {
           if(Do){temp02="3";}
           if(Re){temp02="1";}
           if(Fa){temp02="2";}
           if(Sol){temp02="4";}
           
           //temp02="min";
           temp04=",";
               
           }
       }
       
       if(this.Nota.Tipo==1){TT=this.Nota.Tipol+temp01+temp02+TT;TTABC=temp03+this.Nota.Tipol+temp04+TTABC;}
       if(this.Nota.Tipo==2){TT=this.Nota.Tipol+temp01+temp02+TT;TTABC=temp03+this.Nota.Tipol+temp04+TTABC;}
       if(this.Nota.Tipo==3){TT=this.Nota.Tipol+temp01+temp02+TT;TTABC=temp03+this.Nota.Tipol+temp04+TTABC;}
       if(this.Nota.Tipo==4){TT=this.Nota.Tipol+temp01+temp02+TT;TTABC=temp03+this.Nota.Tipol+temp04+TTABC;}
       if(this.Nota.Tipo==5){TT=this.Nota.Tipol+temp01+temp02+TT;TTABC=temp03+this.Nota.Tipol+temp04+TTABC;}
       if(this.Nota.Tipo==6){TT=this.Nota.Tipol+temp01+temp02+TT;TTABC=temp03+this.Nota.Tipol+temp04+TTABC;}
       if(this.Nota.Tipo==7){TT=this.Nota.Tipol+temp01+temp02+TT;TTABC=temp03+this.Nota.Tipol+temp04+TTABC;}
       if(this.Nota.Tipo==0){TT="R"+temp02+temp01+TT;TTABC=temp03+"z"+TTABC;}    
            
       
       
       
        //  if(this.Nota.Mayor){TT=TT+"maj";}
        // if(this.Nota.Menor){TT=TT+"min";}
       
       if(this.subNota!=null)
       {
       TT=SubT+" "+TT;
       TTABC=SubTABC+" "+TTABC;      
       }
       
       if(this.Repetir>1)
       {
           int j;
           String temporalTT="";
           String temporalTTABC="";
           for(j=0;j<this.Repetir;j++)
           {
               temporalTT=temporalTT+" "+TT;
               temporalTTABC=temporalTTABC+" "+TTABC;
           }
           TTABC=temporalTTABC;
           TT=temporalTT;
       }
   
       
       
       this.Traduccion=TT;
       this.TraduccionABC4J=TTABC;
      
       return res;
   }
    
    public Nota clone()
    {
        Nota a=null;
        try {
            a=(Nota) super.clone();
        } catch (CloneNotSupportedException ex) {
            Logger.getLogger(Nota.class.getName()).log(Level.SEVERE, null, ex);
        }
        return a;
    }
}
